package com.wx.chapter17.syn;

/**
 * @Author : 佩萁
 * Description :
 * @Create : 2023/8/19 - 10:07
 */
public class SellTicket {
    public static void main(String[] args) {
        SellTicket03 sellTicket03 = new SellTicket03();
//        new Thread(sellTicket03).start();//第1个线程-窗口
//        new Thread(sellTicket03).start();//第2个线程-窗口
//        new Thread(sellTicket03).start();//第3个线程-窗口
        SellTicket03.m1();
    }
}

class SellTicket03 implements Runnable {
    private int ticketNum = 100;//多个线程共享
    private boolean loop = true;//控制run方法退出
    Object object = new Object();

    //如果是静态方法，锁加载类本身，而不是对象
    public /*synchronized*/ static void m1() {
        synchronized (SellTicket.class) {//这里面放入的是类
            System.out.println("m2");
        }
    }

    private /*synchronized*/ void sell() throws InterruptedException {//同一时刻只允许一个线程操作此方法，为什么不把synchronized
        //放在run方法，因为如果放在run方法就不会多线程了呀，我们需要控制的只是这些线程操作的一个行为
        synchronized (/*this*/object) {//锁住的是同一个对象，this
            if (ticketNum <= 0) {
                System.out.println("售票结束...");
                loop = false;
                return;//return语句直接返回结束
            }
            Thread.sleep(50);
            System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
                    + " 剩余票数=" + (--ticketNum));
        }
    }

    @Override
    public void run() {
        while (loop) {
            try {
                sell();//sell方法是各个线程的一个行为，是一个同步方法
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}